ContentfulのManagement APIのPython SDKを使って画像を登録する方法
Contentful Management APIについて
Contentfulでは管理画面で行うような操作もAPI経由で行うことが可能です。
例えば、記事の投稿や画像コンテンツの追加など様々ことがAPIで操作できて便利です。
今回は画像コンテンツなどを扱うAssetの追加をPythonのContentful Management APIのSDKで行う方法を整理していきます。
インストール
Contentful Management APIのPython SDKはpipでインストールすることが可能です。
pip install contentful_management
スクリプトを書く前に
ContentfulのManagement APIを利用するにはAPIキーをクライアントに渡してあげる必要があります。
API_TOKEN = os.environ['CONTENTFUL_API_TOKEN'] SPACE_ID = os.environ['CONTENTFUL_SPACE_ID'] ENVIRONMENT_ID = os.environ['CONTENTFUL_ENVIRONMENT_ID'] client = CMClient(API_TOKEN) env = client.environments(SPACE_ID).find(ENVIRONMENT_ID)
ここではAPIキーを環境変数から取得し、Contentfulのスペースと環境を指定しています。
Assetの追加
Assetの追加は以下のように行います。
asset_id
は文字列です。
file_attributes
は辞書型です。(詳しくは後述)
asset = env.assets().create( asset_id, file_attributes ) asset.process()
ポイントはasset.process()
の部分です。
Assetを追加しただけではContentfulでファイルが使えるようになるわけではありません。
process
を行うことでContentful側で処理が走り、使用可能になります。
例えば、ファイルとして画像のURLを指定した場合、process
を実行するまでは画像の取得が行われないといった感じです。
file_attributesについて
file_attributes
の中身は以下のような構造になっています。
これはURLから画像を取得しContentfulに追加する場合です。
file_attributes = { "fields": { "title": { "en-US": "cat" # タイトル }, "description": { "en-US": "cute cat" # 説明 }, "file": { "en-US": { "contentType": "image/jpeg", # MIMEタイプ "fileName": "cat.jpeg", # ファイル名 "upload": "https://xxxxx.yyy/cat.jpg" # ファイルソース } }, }, }
もちろんローカルファイルからアップロードすることも可能です。
ここではアップロードオブジェクトを作成し、それをfile_attributes
に指定しています。
with open('cat.jpg') as buffer: upload = env.uploads().create(buffer) # アップロードオブジェクトを作成 file_attributes = { "fields": { "title": { "en-US": "cat" # タイトル }, "description": { "en-US": "cute cat" # 説明 }, "file": { "en-US": { "contentType": "image/jpeg", # MIMEタイプ "fileName": "cat.jpeg", # ファイル名 "uploadFrom": upload.to_link().to_json() # ファイルソース } }, }, }
タグの指定
Assetにはタグを指定することも可能です。
Assetのタグは以下の以下の2通りの方法で設定可能です。
作成時に指定する方法
file_attributes
に_metadata
を追加しそこでタグを指定することが可能です。
file_attributes = { "fields": { # 中略 }, "_metadata": { "tags": [{ "sys": { "type": "Link", "linkType": "Tag", "id": "animal" } }] } }
後から追加する方法
後から追加する場合はAssetオブジェクトのupdate
メソッドを使用します。
ここでは更新したいプロパティのみの指定で大丈夫です。
new_file_attributes = { "_metadata": { "tags": [{ "sys": { "type": "Link", "linkType": "Tag", "id": "animal" } }] } } asset.update(new_file_attributes)
終わりに
今回はContentfulのManagement APIのPython SDKを使ってアセットを追加する方法を整理しました。 タグの指定が個人的に少しハマりました。(アンダースコアからキーを始める必要がある点) ただ、簡単にファイルのアップロードができるので便利だと思います。